关于跬步应用的服务器部署过程,程序通过python编写,部署在阿里ECS云服务器上。
系统基本信息
登陆 阿里云服务器
1 | Ubuntu 12.04 |
部署前的准备
安装Xshell
登陆服务器进行服务的部署
首先检查 python版本
1 | python –v |
安装WINSCP (或者其他FTP客户端),服务端需安装配置vsftp(具体见附录一)
登陆用来上传文件,还可以用来查看文件结构
安装mysql 及mysqldb
1 | sduo Apt-get update |
安装nginx
1 | sudo apt-get nginx |
Nginx的配置文件是/etc/nginx/nginx.conf,具体的配置信息见后.
安装后在本地测试是否成功http://115.28.200.109/
Mysql 服务
客户端连接服务端的问题,安装完mysql 后,为客户端创建一个用户
1 | Use mysql ; |
搭建环境
- 下载virtualenv.py (这里使用已经下载好的,后面的可以略过)
1 | 通过命令 |
- 创建虚拟环境
1 | cd 到 /home/kuibu/ |
3. 创建项目目录
mkdir /flask/apps/ 其中存放我们服务端项目的代码
4. 安装flask
完成上面的步骤,接下来就来安装flask等其附属的第三方模块:
1 | $ flask/bin/pip install flask |
获取最新版nginx稳定版参见
http://www.kaijia.me/2013/05/ubuntu-latest-nginx-repo-collection/
1 | sudo /etc/init.d/nginx start |
配置文件 /etc/nginx/sites-avaliable/default, nginx的优化配置文件在/etc/nginx/nginx.conf
部署
基本架构 nginx + flask + gunicorn + gevent
Nginx反向代理及配置
跬步使用到socketio, 部署要使用 gunicorn 作为web服务容器,所以首先要安装先切换到虚拟环境,然后pip install gunicorn 即可,详见http://gunicorn.org/ ,注意这里需要加上版本号 pip install gunicorn==18.0
gunicorn 作为web服务容器,前端使用nginx做反向代理,配置如下
1 | server { |
重启nginx
配置gunicorn
在项目目录下编写配置文件gunicorn.conf
先切换到项目目录 cd apps ;
编写配置文件gunicorn.conf
1 | workers = 4 |
1 | ..bin/gunicorn --config gunicorn.conf run:app |
启动成功后,通过命令查看后台进程
1 | ps -ef | grep kuibu |
参考链接
- http://flask-socketio.readthedocs.org/en/latest/
- http://www.open-open.com/lib/view/open1423107543014.html
使用 supervisor 管理gunicorn 进程
基本用法
1 | ##sudo安装 sudo apt-get install supervisor |
参考配置
配置示例
- 文件内容
1 | [program:dylan] |
- 注意项目目录和gunicorn的配置文件地址
1 | command=/home/bob/dylan/bin/gunicorn runserver:app -c /home/bob/dylan/gunicorn.conf directory=/home/bob/dylan |
- log文件的位置
1 | stdout_logfile=/home/bob/logs/gunicorn_supervisor.log |
- 重新读取配置
1 | sudo supervisorctl reread |
通过浏览器管理supervisor
- 配置/etc/supervisor/supervisord.conf 添加以下内容
1 | [unix_http_server] |
详见 http://supervisord.org/configuration.html#inet-http-server-section-settings
2. 在对应的nginx配置中添加
1 | location /supervisor { |
这样我们就可以远程对其进行管理。
测试
- 安装ab测试工具
sudo apt-get install apache2-utils - 简单测试
$time ab -n 200 -c 200 http://115.28.200.109/caddy/api/v1.0/test - 实际测试
time ab -n 2000 -c 1000 -H keywords:dt -p /home/kuibu/param.conf -T ‘application/json; charset=utf8’ http://115.28.200.109/caddy/api/v1.0/get_collections
其中params.conf 的内容如下:
data_type=HOME_LIST&uid=9&action=INIT&threshold=-1 - 压力测试结果
在远程对web服务器进行压力测试,往往效果不理想(因为网络延时过大),建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。如果只有单独的一台服务器,可以直接本地测试,比远程测试效果要准确。
关于ab的使用,参考 http://www.ha97.com/4617.html
附录一 安装其他模块
Ubuntu/Debian安装vsftp软件
- 更新软件源
首先需要更新系统的软件源,便捷工具下载地址:http://help.aliyun.com/manual?spm=0.0.0.0.zJ3dBU&helpId=1692 - 安装vsftp
使用apt-get命令安装vsftp
1 | #apt-get install vsftpd –y |
- 添加ftp帐号和目录
先检查一下nologin的位置,通常在/usr/sbin/nologin或者/sbin/nologin下。使用下面的命令创建帐户,该命令指定了/alidata/www/wwwroot为用户pwftp的家目录,您可以自己定义帐户名和目录:
1 | #useradd -d /alidata/www/wwwroot -s /sbin/nologin pwftp |
- 配置vsftp
编辑vsftp配置文件,命令如下:
1 | #vi /etc/vsftpd.conf |
将配置文件中”anonymous_enable=YES “改为 “anonymous_enable=NO”
取消如下配置前的注释符号:
1 | local_enable=YES |
保存退出,编辑/etc/vsftpd.chroot_list文件,将ftp的帐户名添加进去,保存退出
-
修改shell配置
vi编辑/etc/shells,如果该文件里没有/usr/sbin/nologin或者/sbin/nologin(具体看当前系统配置)则追加进去 -
重启vsftp服务并测试登录,使用命令启动vsftp服务:
1 | #service vsftpd restart |
然后用帐号pwftp测试下是否可以登陆ftp。目录是/alidata/www/wwwroot。
PIL安装
具体参见 http://jinvan.com/post/install-pil-on-ubuntu
- 安装依赖包
1 | sudo apt-get install libjpeg8-dev zlib1g-dev libfreetype6-dev |
2. 创建链接,因为PIP安装软件包时,并没有安装在系统路径里,因此做一个软连接。
1 | ln -s /usr/lib/`uname -i`-linux-gnu/libfreetype.so /usr/lib/ |
- 准备工作做好了,安装PIL
1 | sudo pip install pil |
附录二 Error 汇总
- 安装Mysql-python 报错
Python.h: No such file or directory 需要
1 | $ sudo apt-get install python-dev |
2. IOError: [Errno 26] Text file busy: ‘flask/bin/python’
Lsof
1 | unlink flask/bin/python |
- greenlet.h:8:20: fatal error: Python.h: No such file or directory
1 | 解决 sudo apt-get install python-dev |
4. 安装MySQL-python EnvironmentError: mysql_config not found
1 | sudo apt-get install libmysqlclient-dev |
5. 关于使用flask - socketio
1 | ../bin/gunicorn -c gunicorn.conf run:app |
这是由于gunicorn 版本问题引起的,当前版本如果>18.0 修会出现这个问题,
所以需要将当前版本回归到18.0及以下
https://github.com/miguelgrinberg/Flask-SocketIO/issues/93
附录三 Linux命令
-
杀死服务进程
ps -ef | grep kuibu
kill -s 9 24578 -
查看目录权限
ll -
查看内存使用
free –m
top